package algorithm.middle;

/**
 * @author 江岸
 * @version V1.0
 * @ClassName: LongestOnes1004
 * @description: 给定一个由若干 0 和 1 组成的数组 A，我们最多可以将 K 个值从 0 变成 1 。
 *
 * 返回仅包含 1 的最长（连续）子数组的长度。
 * @date 2021/2/2216:11
 * @since V1.0
 */
public class LongestOnes1004 {
    public static void main(String[] args) {
        int[] arr = {1,1,1,0,0,0,1,1,1,1,0};
        int num = 2;
        System.out.println(longestOnes(arr,2));
    }

    public static int longestOnes(int[] A, int K) {
        int res=0;
        int count=0;
        int useNum=0;
        int left=0;
        int right=0;
        while (right<A.length){
            if (A[right]==1){
                count++;
                res = Math.max(res,count);
                right++;
                continue;
            }
            if (A[right]==0){
                //如果K还没用完
                if (useNum<K){
                    count++;
                    res =  Math.max(res,count);
                    right++;
                    useNum++;
                    continue;
                }else {
                 //K用完了
                    if (A[left]==1){
                    //如果当左指针停留在1上
                        while (A[left]==1){
                            left++;
                            count--;
                        }
                    }else {
                    //如果当左指针停留在0上
                    left++;
                    count--;
                    useNum--;
                    }
                }
            }
        }
        return res;
    }

    //滑动窗口
    public int 官方题解(int[] A, int K) {
        int N = A.length;
        int res = 0;
        int left = 0, right = 0;
        int zeros = 0;
        while (right < N) {
            if (A[right] == 0)
                zeros ++;
            while (zeros > K) {
                //先用再加
                if (A[left++] == 0)
                    zeros --;
            }
            res = Math.max(res, right - left + 1);
            right ++;
        }
        return res;
    }


}
